package timing.ukulele.common.data;

import org.springframework.lang.NonNull;

/**
 * 服务层返回结果
 */
public class ResponseData<T> {

    /**
     * 返回码
     */
    private Integer code;

    /**
     * 返回描述
     */
    private String message;

    private T data;

    public ResponseData() {
    }

    public ResponseData(@NonNull ResponseCode responseCode) {
        this(responseCode.getCode(), responseCode.getMessage());
    }

    public ResponseData(@NonNull ResponseCode responseCode, T data) {
        this(responseCode.getCode(), responseCode.getMessage(), data);
    }

    public ResponseData(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public ResponseData(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }


    /**
     * 操作成功携带数据
     *
     * @param data 数据
     * @param <T>  类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> success(T data) {
        return new ResponseData<>(ResponseCode.SUCCESS.getCode(), "操作成功.", data);
    }

    /**
     * 操作成功不带数据
     *
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> success() {
        return new ResponseData<>(ResponseCode.SUCCESS.getCode(), "操作成功.", null);
    }

    /**
     * 操作成功携带数据
     *
     * @param message 成功提示消息
     * @param data    成功携带数据
     * @param <T>     类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> success(String message, T data) {
        return new ResponseData<>(ResponseCode.SUCCESS.getCode(), message, data);
    }

    /**
     * 操作失败返回
     *
     * @param message 成功提示消息
     * @param <T>     类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> error(String message) {
        return new ResponseData<>(ResponseCode.BUSINESS_ERROR.getCode(), message, null);
    }

    /**
     * 操作失败返回
     *
     * @param code    错误码
     * @param message 成功提示消息
     * @param <T>     类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> error(Integer code, String message) {
        return new ResponseData<>(code, message, null);
    }

    /**
     * 参数错误返回
     *
     * @param message 错误提示消息
     * @param <T>     类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> paramError(String message) {
        return new ResponseData<>(ResponseCode.PARA_ERROR.getCode(), message);
    }

    /**
     * 参数错误返回
     *
     * @param <T> 类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> paramError() {
        return new ResponseData<>(ResponseCode.PARA_ERROR);
    }

    /**
     * oauth2 问题
     *
     * @param message 失败提示消息
     * @param data    具体的错误信息
     * @param <T>     类型
     * @return 返回统一响应
     */
    public static <T> ResponseData<T> oauth2Error(String message, T data) {
        return new ResponseData<>(ResponseCode.UNAUTHORIZED_ERROR, data);
    }

}
